package com.example.exporttemplate.service;

import com.example.exporttemplate.utils.PictureUtils;
import freemarker.template.Configuration;
import freemarker.template.DefaultObjectWrapper;
import freemarker.template.Template;
import freemarker.template.TemplateException;
import org.springframework.stereotype.Service;

import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.nio.charset.StandardCharsets;
import java.util.HashMap;
import java.util.Map;

/**
 * freemarker导出word业务类
 *
 * @author liulindong
 * @version 2022/9/21 23:06
 */
@Service
public class FreeMarkerExportService {

    private static final String CONTENT_TYPE = "application/msword;charset=UTF-8";

    /**
     * docx有问题，目前没有找到方法
     */
    private static final String FILE_NAME = new String("测试freemarker生成word".getBytes(), StandardCharsets.ISO_8859_1) + ".doc";

    /**
     * freemarker配置
     */
    private static final Configuration CONFIGURATION = new Configuration(Configuration.VERSION_2_3_28);

    public void exportFreeMarkerByDocx(HttpServletResponse response) {
        try {
            response.setContentType(CONTENT_TYPE);
            response.setHeader("Content-Disposition", "attachment;filename=" + FILE_NAME);
            // 获取输出流
            CONFIGURATION.setDirectoryForTemplateLoading(new File("src/main/resources/wordTemplate"));
            CONFIGURATION.setObjectWrapper(new DefaultObjectWrapper(Configuration.VERSION_2_3_28));
            Template template = CONFIGURATION.getTemplate("/picture.ftl");
            Map<String, Object> dataMap = new HashMap<>();
            String base64 = PictureUtils.imageToBase64Online("https://staticfile.eec-cn.com/ff80808168237aa701683abc0f685341/richtext/image/20200219/1582094211591015454.png");
            dataMap.put("title", base64);
            dataMap.put("name", "刘林栋");
            dataMap.put("address", "山东枣庄");
            dataMap.put("age", "22");
            PrintWriter writer = response.getWriter();
            template.process(dataMap, writer);
            writer.close();
        } catch (IOException | TemplateException e) {
            e.printStackTrace();
        }

    }



    public void exportFreeMarkerByHtml(HttpServletResponse response) {
        try {
            response.setContentType(CONTENT_TYPE);
            response.setHeader("Content-Disposition", "attachment;filename=" + FILE_NAME);
            // 获取输出流
            CONFIGURATION.setDirectoryForTemplateLoading(new File("src/main/resources/wordTemplate"));
            CONFIGURATION.setObjectWrapper(new DefaultObjectWrapper(Configuration.VERSION_2_3_28));
            CONFIGURATION.setDefaultEncoding("UTF-8");
            Template template = CONFIGURATION.getTemplate("/htmltemp.ftl", "UTF-8");
            Map<String, Object> dataMap = new HashMap<>();
            dataMap.put("title", "<html>\n <head></head>\n <body>\n  <h1 id=\"VXE8-1\">这是标题一</h1>\n  <p><span class=\"ck-inline-image\"><img class=\"ck-inline-image-align\" src=\"\" alt=\"\\frac {2} {3}\"></span></p>\n  <p style=\"text-align:right;\">右对齐的一句话</p>\n  <p style=\"text-align:center;\">居中对齐的一句话</p>\n  <h2 id=\"G1JS-2\">这是标题二</h2>\n  <p><strong>加粗的一句话</strong></p>\n  <p><i>斜体的一句话。</i></p>\n  <p><u>有下划线的一句话</u></p>\n  <p><s>有删除线的一句话</s></p>\n  <p><s><sub>下标</sub></s><sub><sup>上标</sup></sub></p>\n  <p>有上标的一句话<sup>上标</sup></p>\n  <p>有下标的一句话<sub>下标</sub></p>\n  <p><span style=\"color:#FF0000;\">字体颜色为红色</span></p>\n  <p><span style=\"background-color:#00B0F0;\">背景颜色为蓝色</span></p>\n  <p><mark class=\"marker-default\">高亮显示的一句话</mark></p>\n  <p><mark class=\"marker-default\">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</mark></p>\n  <h3 id=\"OTBA-3\">这是标题三</h3>\n  <p><a href=\"www.baidu.com\">www.baidu.com</a></p>\n  <h4 id=\"KADS-4\">这是标题四</h4>\n  <p style=\"margin-left:4em;\">首行缩进</p>\n  <ul>\n   <li>第一点</li>\n   <li>第二点</li>\n  </ul>\n  <ol>\n   <li>序号一</li>\n   <li>序号二#$%$^$^%&amp;%&amp;*%^*%^&amp;%@#$%^&amp;&amp;*(&amp;%^$&lt;&gt;{}{&lt;&lt;MMMM@!#$@$%^&lt;h1&gt;gggg&lt;/h1&gt;￥￥￥￥￥</li>\n  </ol>\n  <h5>这是标题五</h5>\n  <figure class=\"table\">\n   <table>\n    <tbody>\n     <tr>\n      <td>滚滚滚</td>\n      <td>ffff</td>\n      <td>反反复复</td>\n     </tr>\n     <tr>\n      <td>fff</td>\n      <td colspan=\"2\">夫妇付付付付付付付付付付付付付</td>\n     </tr>\n    </tbody>\n   </table>\n  </figure>\n  <figure class=\"image image_resized\" style=\"width:845px;\">\n   <img src=\"https://tecs-tev-static.obs.cn-north-1.myhuaweicloud.com:443/4771c6a021984d6a88e02cd4cdd9cc4c%2Frichtext%2Fimage%2F20230215%2F54d7979ee6d340d4923b8e5e6545483a.png\">\n  </figure>\n  <pre><code class=\"java-code java\">版本版本不不不不不不不不不\n的点点滴滴多多多多多多多多多多多多多多多多多多\n但是</code></pre>\n  <blockquote>\n   <p>块引用</p>\n  </blockquote>\n  <p><span class=\"ck-inline-image\"><img class=\"ck-inline-image-align\" src=\"\" alt=\"\\frac {dy} {dx}\"></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class=\"ck-inline-image\"><img class=\"ck-inline-image-align\" src=\"\" alt=\"\\sin {2}2\"></span></p>\n  <p>&nbsp;</p>\n  <p>&nbsp;</p>\n  <p>&nbsp;</p>\n  <p>€₿₻ŢŴ$¥£¢₠₡₣₤¤₿‰‱🔙🔚ĈĔĕėġū₺™ħŴ</p>\n  <p>&nbsp;</p>\n  <p>&nbsp;</p>\n  <p><span style=\"background-color:white;color:#333333;\">&nbsp; 本课程是面向JavaEE企业级应用开发的平台技术，是在学习Java Web技术基础课程后，面向企业实际应用的综合性课程。JavaEE开发技术以其开放性、灵活性、安全性、跨平台和技术成熟度，在企业级业务开发领域中占据了较大的市场份额，同时以其优秀的体系架构及开发规范，为大型企业机构创建分布式、安全的、具有高反应性的网络应用提供技术支持。</span></p>\n  <p><span style=\"background-color:white;color:#333333;\">&nbsp; 本课程以JavaEE开发技术的三个主流框架：SpringMVC、Spring、MyBatis为核心，分别对三个框架的起源背景、发展优势、系统架构、运行原理、框架功能进行全面细致的介绍，并配以大量课程案例和企业真实项目实验，从理论到实践对学生进行综合能力的培养，为后续学生进行中大型企业应用开发奠定坚实基础。本课程目标具体如下：</span></p>\n  <ol>\n   <li><span style=\"background-color:white;color:#333333;\">理解框架及Spring IOC容器、Bean生命周期、AOP等理念的核心思想；</span></li>\n   <li><span style=\"background-color:white;color:#333333;\">掌握Spring框架的Bean依赖配置、AOP实现、数据库操作、事务管理、线程池、任务调度等操作；</span></li>\n   <li><span style=\"background-color:white;color:#333333;\">理解SpringMVC工作原理；</span></li>\n   <li><span style=\"background-color:white;color:#333333;\">掌握SpringMVC框架的常用注解、数据转换和格式化、标签库、国际化、文件上传下载、拦截器、JSON数据交互和RESTful支持；</span></li>\n   <li><span style=\"background-color:white;color:#333333;\">理解MyBatis工作原理及发展史；</span></li>\n  </ol>\n  <p><span style=\"background-color:white;color:#333333;\">掌握MyBatis框架的核心配置、关联映射、延迟加载、缓存、动态SQL等操作</span></p>\n  <p>&nbsp;</p>\n </body>\n</html>");
            ServletOutputStream outputStream = response.getOutputStream();

            OutputStreamWriter osw = new OutputStreamWriter(outputStream);
            template.process(dataMap, osw);
            osw.flush();
            osw.close();
            outputStream.close();
        } catch (IOException | TemplateException e) {
            e.printStackTrace();
        }
    }
}
